package top.kaoshanji.p4ch26b;

/**
 * 代码清单-p4ch26b-332页b：电梯实现类
 * 好像并不是完整版本..有些不足..
 * @author kaoshanji
 * ^_^
 * create time 2025/3/27 15:29
 */
public class Lift implements ILift {

    private int state;

    @Override
    public void setSate(int state) {
        this.state = state;
    }

    // 电梯：运行或停止
    // 电梯门：敞门或闭门

    // 状态之间可以转换，就有逻辑
    // 状态之间不能转换，就没逻辑
    // 状态之间能不能转换，和状态和行为的关系在那张图里

    // 电梯门开启状态
    @Override
    public void open() {
        // 什么操作能使电梯门流转到开启状态...停止
        // 电梯门处于开启状态下能做什么...闭门
        switch (this.state) {
            case OPENING_STATE: // 敞门状态，什么都不做
                break;
            case CLOSING_STATE: // 闭门状态，则可以开启
                this.openWithoutLogic();
                this.setSate(OPENING_STATE);
                break;
            case RUNNING_STATE: // 运行状态，则不能开门，什么都不做
                break;
            case STOPPING_STATE: // 停止状态，可以开门
                this.openWithoutLogic();
                this.setSate(OPENING_STATE);
                break;
        }

    }

    // 电梯门处于关闭状态
    @Override
    public void close() {
        // 电梯在什么状态下才能关闭
        // 什么操作能使电梯门流转到关闭状态...敞门
        // 电梯门处于关闭状态下能做什么...敞门
        switch (this.state) {
            case OPENING_STATE: // 可以关门，同时修改电梯状态
                this.closeWithoutLogic();
                this.setSate(CLOSING_STATE);
                break;
            case CLOSING_STATE: // 电梯是关门状态，则什么都不做
                break;
            case RUNNING_STATE: // 正在运行，门本来就是关闭的，也什么都不做
                break;
            case STOPPING_STATE: // 停止状态，门也是关闭的，什么也不做
                break;
        }

    }

    // 电梯开始运行起来
    @Override
    public void run() {
        // 什么操作能使电梯流转到运行状态...闭门...停止
        // 电梯处于运行状态下能做什么...停止
        switch (this.state) {
            case OPENING_STATE: // 敞门状态，什么都不做
                break;
            case CLOSING_STATE: // 闭门状态，则可以运行
                this.runWithoutLogic();
                this.setSate(RUNNING_STATE);
                break;
            case RUNNING_STATE: // 运行状态，则什么都不做
                break;
            case STOPPING_STATE: // 停止状态，可以运行
                this.runWithoutLogic();
                this.setSate(RUNNING_STATE);
        }

    }

    // 电梯停止
    @Override
    public void stop() {
        // 什么操作能使电梯流转到停止状态...闭门
        // 电梯处于停止状态下能做什么...运行..也可以开门啊
        switch (this.state) {
            case OPENING_STATE: // 敞门状态，什么都不做
                break;
            case CLOSING_STATE: // 闭门状态，可以停止
                this.stopWithoutLogic();
                this.setSate(CLOSING_STATE);
                break;
            case RUNNING_STATE: // 运行状态，有运行当然那也就有停止了
                this.stopWithoutLogic();
                this.setSate(CLOSING_STATE);
                break;
            case STOPPING_STATE: // 停止状态，什么都不做
                break;
        }

    }


    /**
     * 纯粹的电梯关门，不考虑实际的逻辑
     */
    private void closeWithoutLogic() {
        System.out.println("电梯门关闭...");
    }

    /**
     * 纯粹的电梯开门，不考虑任何条件
     */
    private void openWithoutLogic() {
        System.out.println("电梯门开启...");
    }

    /**
     * 纯粹的运行，不考虑其他条件
     */
    private void runWithoutLogic() {
        System.out.println("电梯上下运行起来...");
    }

    /**
     * 单纯的停止，不考虑其他条件
     */
    private void stopWithoutLogic() {
        System.out.println("电梯停止了...");
    }

}
